package chess.piece;

import javax.swing.ImageIcon;
import java.util.ArrayList;
import chess.Constants;
import chess.Position;
import chess.Status;

/**
 * Classe Abstrata Piece (peça)
 * @author Beatriz Miho Anami
 * @author Lucas Rodrigues Anizelli
 * @author Marcos Okamura Rodrigues
 */
public abstract class Piece implements Constants {
	protected int id;
	protected Position position;
	protected int color;
	protected ImageIcon imageIcon;
	
	/**
	 * Número de peças.
	 */
	public static final int NUMBER_OF_PIECES = 16;
	/**
	 * Número de jogadores.
	 */
	public static final int NUMBER_OF_PLAYERS = 2;
	/**
	 * Constante para primeira torre.
	 */
	public static final int ROOK_1 = 0;
	/**
	 * Constante para primeiro cavalo.
	 */
	public static final int KNIGHT_1 = 1;
	/**
	 * Constante para primeiro bispo.
	 */
	public static final int BISHOP_1 = 2;
	/**
	 * Constante para dama.
	 */
	public static final int QUEEN = 3;
	/**
	 * Constante para rei.
	 */
	public static final int KING = 4;
	/**
	 * Constante para segundo bispo.
	 */
	public static final int BISHOP_2 = 5;
	/**
	 * Constante para segundo cavalo.
	 */
	public static final int KNIGHT_2 = 6;
	/**
	 * Constante para segunda torre.
	 */
	public static final int ROOK_2 = 7;
	
	/**
	 * Construtor da peça.
	 * @param id		id da peça
	 * @param position	posição da peça
	 * @param color		cor da peça
	 * @param imageIcon	imageIcon da peça
	 */
	public Piece(int id, Position position, int color, ImageIcon imageIcon) {
		this.id = id;
		this.position = position;
		this.color = color;
		this.imageIcon = imageIcon;
	}
	
	/**
	 * Retorna o id da peça
	 * @return	id da peça
	 */
	public int getId(){
		return this.id;
	}
	
	/**
	 * Retorna a posição da peça.
	 * @return 	posição da peça
	 */
	public Position getPosition(){
		return this.position;
	}
	
	/**
	 * Retorna a cor da peça.
	 * @return 	cor da peça
	 */
	public int getColor(){
		return this.color;
	}

	/**
	 * Modifica a posição da peça.
	 * @param position	nova posição da peça 
	 */
	public void setPosition(Position position){
		this.position = position;
	}
	
	/**
	 * Retorna o imageIcon da peça
	 * @return	imageIcon da peça
	 */
	public ImageIcon getImageIcon() {
		return this.imageIcon;
	}
	
	/**
	 * Verifica se a peça pode capturar uma peça na posição especificada do tabuleiro.
	 * @param position	posição da peça a ser capturada
	 * @return 			o status da captura
	 */
	public abstract Status canCapture(Position position);

	/**
	 * Verifica se a peça pode ser movida para a posição especificada do tabuleiro.
	 * @param position	nova posição da peça
	 * @return 			o status do movimento
	 */
	public abstract Status canMove(Position position);
	
	/**
	 * Retorna o raio de alcance da peça no tabuleiro.
	 * @return	ArrayList com as posições de alcance da peça
	 */
	public abstract ArrayList<Position> getRange();
}
